[gdk] Add gdk_keymap_get_num_lock_state
authorWilliam Jon McCann <jmccann@redhat.com>
Thu, 1 Jul 2010 22:45:06 +0000 (18:45 -0400)
committerWilliam Jon McCann <jmccann@redhat.com>
Fri, 2 Jul 2010 01:44:09 +0000 (21:44 -0400)
https://bugzilla.gnome.org/show_bug.cgi?id=623239

gdk/directfb/gdkkeys-directfb.c
gdk/gdk.symbols
gdk/gdkkeys.h
gdk/quartz/gdkkeys-quartz.c
gdk/win32/gdkkeys-win32.c
gdk/x11/gdkkeys-x11.c

index fb72321089beaf3c4ea4c3a264e4c7113799b5de..7ca259714efe3aa0321791141d5c3248a24fbf30 100644 (file)
@@ -1758,6 +1758,24 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
   return FALSE;
 }
 
+/**
+ * gdk_keymap_get_num_lock_state:
+ * @keymap: a #GdkKeymap
+ *
+ * Returns whether the Num Lock modifer is locked.
+ *
+ * Returns: %TRUE if Num Lock is on
+ *
+ * Since: 3.0
+ */
+gboolean
+gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
+{
+  /* FIXME: Can we implement this? */
+
+  return FALSE;
+}
+
 /**
  * gdk_keymap_get_entries_for_keycode:
  * @keymap: a #GdkKeymap or %NULL to use the default keymap
index ca44318bf0fc31df70562163e1ac2d705d0841eb..455cacebb83e4ed73533becd9ecc3ef1d9aa5887 100644 (file)
@@ -861,6 +861,7 @@ gdk_keymap_get_entries_for_keyval
 gdk_keymap_get_for_display
 gdk_keymap_have_bidi_layouts
 gdk_keymap_get_caps_lock_state
+gdk_keymap_get_num_lock_state
 gdk_keymap_lookup_key
 gdk_keymap_translate_keyboard_state
 gdk_keymap_add_virtual_modifiers
@@ -878,6 +879,7 @@ gdk_keymap_get_entries_for_keycode
 gdk_keymap_get_entries_for_keyval
 gdk_keymap_get_for_display
 gdk_keymap_get_caps_lock_state
+gdk_keymap_get_num_lock_state
 gdk_keymap_lookup_key
 gdk_keymap_translate_keyboard_state
 gdk_keymap_add_virtual_modifiers
index ebab21bfcb0a569ee77bae01dbe2ebcc6d615a8d..212c680a7c81f549765ae272811cfdbcdbe5a591 100644 (file)
@@ -108,6 +108,7 @@ gboolean       gdk_keymap_get_entries_for_keycode  (GdkKeymap           *keymap,
 PangoDirection gdk_keymap_get_direction            (GdkKeymap           *keymap);
 gboolean       gdk_keymap_have_bidi_layouts        (GdkKeymap           *keymap);
 gboolean       gdk_keymap_get_caps_lock_state      (GdkKeymap           *keymap);
+gboolean       gdk_keymap_get_num_lock_state       (GdkKeymap           *keymap);
 void           gdk_keymap_add_virtual_modifiers    (GdkKeymap           *keymap,
                                                     GdkModifierType     *state);
 gboolean       gdk_keymap_map_virtual_modifiers    (GdkKeymap           *keymap,
index 52b08677a5e9f8929e33f3d298b129f17051aad4..729f320f7acb1a0735e04675ffd867e4a6f5c973 100644 (file)
@@ -451,6 +451,13 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
   return FALSE;
 }
 
+gboolean
+gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
+{
+  /* FIXME: Implement this. */
+  return FALSE;
+}
+
 gboolean
 gdk_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                    guint          keyval,
index eff2ebec802e6c1b37b71b28d748152a48a8a4a3..bd6a096e0079fc6095f087faf7d5e7bc9d1f4264 100644 (file)
@@ -536,6 +536,12 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
   return ((GetKeyState (VK_CAPITAL) & 1) != 0);
 }
 
+gboolean
+gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
+{
+  return ((GetKeyState (VK_NUMLOCK) & 1) != 0);
+}
+
 gboolean
 gdk_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                    guint          keyval,
index 784e0ff5c9fe6fe7bd83aa16ee43bf4ebb8a0fb7..0804700035bbbe319c671d9a5c2f4f994332d836 100644 (file)
@@ -86,6 +86,7 @@ struct _GdkKeymapX11
   guint sun_keypad      : 1;
   guint have_direction  : 1;
   guint caps_lock_state : 1;
+  guint num_lock_state : 1;
   guint current_serial;
 
 #ifdef HAVE_XKB
@@ -276,6 +277,9 @@ get_xkb (GdkKeymapX11 *keymap_x11)
 
   keymap_x11->current_serial = display_x11->keymap_serial;
 
+  if (keymap_x11->num_lock_mask == 0)
+    keymap_x11->num_lock_mask = XkbKeysymToModifiers (KEYMAP_XDISPLAY (GDK_KEYMAP (keymap_x11)), XK_Num_Lock);
+
   return keymap_x11->xkb_desc;
 }
 #endif /* HAVE_XKB */
@@ -687,12 +691,16 @@ update_lock_state (GdkKeymapX11 *keymap_x11,
                    gint          locked_mods)
 {
   gboolean caps_lock_state;
-  
+  gboolean num_lock_state;
+
   caps_lock_state = keymap_x11->caps_lock_state;
+  num_lock_state = keymap_x11->num_lock_state;
 
   keymap_x11->caps_lock_state = (locked_mods & GDK_LOCK_MASK) != 0;
-  
-  return caps_lock_state != keymap_x11->caps_lock_state;
+  keymap_x11->num_lock_state = (locked_mods & keymap_x11->num_lock_mask) != 0;
+
+  return (caps_lock_state != keymap_x11->caps_lock_state)
+    || (num_lock_state != keymap_x11->num_lock_state);
 }
 
 /* keep this in sync with the XkbSelectEventDetails() call 
@@ -713,7 +721,7 @@ _gdk_keymap_state_changed (GdkDisplay *display,
        g_signal_emit_by_name (keymap_x11, "direction-changed");      
 
       if (update_lock_state (keymap_x11, xkb_event->state.locked_mods))
-       g_signal_emit_by_name (keymap_x11, "state-changed");      
+        g_signal_emit_by_name (keymap_x11, "state-changed");
     }
 }
 
@@ -831,6 +839,27 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
   return keymap_x11->caps_lock_state;
 }
 
+/**
+ * gdk_keymap_get_num_lock_state:
+ * @keymap: a #GdkKeymap
+ *
+ * Returns whether the Num Lock modifer is locked.
+ *
+ * Returns: %TRUE if Num Lock is on
+ *
+ * Since: 3.0
+ */
+gboolean
+gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
+{
+  GdkKeymapX11 *keymap_x11;
+
+  keymap = GET_EFFECTIVE_KEYMAP (keymap);
+
+  keymap_x11 = GDK_KEYMAP_X11 (keymap);
+
+  return keymap_x11->num_lock_state;
+}
 
 /**
  * gdk_keymap_get_entries_for_keyval: